﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using ControlDeAsistencia.Properties;

namespace ABM_De_Empleados
{
    public partial class Administracion : Form
    {
        string rutaSQL = "Data Source=localhost;Initial Catalog=ControlAsistenciaEmpleado;Integrated Security=True";
        DataSet ds = new DataSet();

        public Administracion()
        {
            InitializeComponent();
        }

        private void Administracion_Load(object sender, EventArgs e)
        { 
            string ConsultaSQL = "Select * from Empleados order by dni";
            
            dtFechaNac.MaxDate = DateTime.Now;
            dtpIngresosFecha.MaxDate = DateTime.Now;
            agregarTablaDataSetSQLServer(ConsultaSQL,
                                         "Empleados", 
                                         ref ds);
            grdEmpleados.DataSource = ds.Tables[0];
        }

        // Alta ////////////////////////////////////////////////

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            if (validarCamposAlta()) 
            {
                Empleado nuevoEmpleado = new Empleado(int.Parse(txtAltaDNI.Text),
                    txtAltaNombre.Text, 
                    txtAltaApellido.Text, 
                    dtFechaNac.Value.Date,
                    cmbAltaSexo.Text, 
                    cmbAltaEstadoCivil.Text, 
                    int.Parse(txtAltaHijos.Text),
                    txtAltaDireccion.Text, 
                    int.Parse(txtAltaCodPostal.Text), 
                    int.Parse(txtAltaProvincia.Text), 
                    true);
                Empleado compEmpleado = new Empleado();
                if (compEmpleado.obtenerEmpleado(int.Parse(txtAltaDNI.Text)) && compEmpleado.Estado == true)
                {
                    ActualizarEmpleadoEnBD("Empleado", ref nuevoEmpleado);
                    MessageBox.Show("Empleado actualizado exitosamente");
                    return;
                }
                else if (compEmpleado.Dni == int.Parse(txtAltaDNI.Text) && compEmpleado.Estado == false)
                {
                    if (MessageBox.Show("El DNI pertenece a un empleado dado de baja. Desea darlo de alta?", "Restaurar empleado", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        compEmpleado.Estado = true;
                        ActualizarEmpleadoEnBD("Empleado", ref compEmpleado); //Stored Procedure de Actualizar datos ---USAR COMPEMPLEADO---
                        MessageBox.Show("Empleado restaurado exitosamente");
                        return;
                    }
                    else
                        return;
                }
                InsertarEmpleadoEnBD("Empleado", ref nuevoEmpleado); //Stored Procedure de Insertar datos ---USAR NUEVOEMPLEADO---
                MessageBox.Show("Empleado ingresado exitosamente");
            }
        }

        private bool validarCamposAlta()
        {
            Empleado comprobar = new Empleado();
            if (txtAltaDNI.Text == "")
            {
                txtAltaDNI.Focus();
                MessageBox.Show("Ingrese el DNI");
                return false;
            }
            if (comprobar.obtenerEmpleado(int.Parse(txtAltaDNI.Text)) && comprobar.Estado == false)
            {
                txtAltaDNI.Text = comprobar.Dni.ToString();
                txtAltaNombre.Text = comprobar.Nombre;
                txtAltaApellido.Text = comprobar.Apellido;
                dtFechaNac.Value = comprobar.Fechanac.Date;
                cmbAltaSexo.Text = comprobar.Genero;
                cmbAltaEstadoCivil.Text = comprobar.Estadocivil;
                txtAltaHijos.Text = comprobar.Hijos.ToString(); 
                txtAltaDireccion.Text = comprobar.Direccion;
                txtAltaCodPostal.Text = comprobar.CodPostal.ToString();
                txtAltaProvincia.Text = comprobar.Idprovincia.ToString();
                return true;
            }
            if (txtAltaNombre.Text == "")
            {
                txtAltaNombre.Focus();
                MessageBox.Show("Ingrese el Nombre");
                return false;
            }
            if (txtAltaApellido.Text == "")
            {
                txtAltaApellido.Focus();
                MessageBox.Show("Ingrese el Apellido");
                return false;
            }
            if (cmbAltaSexo.Text == "")
            {
                cmbAltaSexo.Focus();
                MessageBox.Show("Ingrese el Sexo");
                return false;
            }
            if (txtAltaDireccion.Text == "")
            {
                txtAltaDireccion.Focus();
                MessageBox.Show("Ingrese la Dirección");
                return false;
            }
            if (txtAltaCodPostal.Text == "")
            {
                txtAltaCodPostal.Focus();
                MessageBox.Show("Ingrese el Codigo Postal");
                return false;
            }
            if (txtAltaProvincia.Text == "" || int.Parse(txtAltaProvincia.Text) > 25 || int.Parse(txtAltaProvincia.Text) < 1)
            {
                txtAltaProvincia.Focus();
                MessageBox.Show("Ingrese una Provincia válida");
                return false;
            }
            if (comprobar.obtenerEmpleado(int.Parse(txtAltaDNI.Text)) && comprobar.Estado == true)
            {
                if (MessageBox.Show("El empleado se encuentra activo, desea actualizar los datos?", "Modificar empleado", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    return true;
                return false;
            }
            return true;
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            txtAltaDNI.Text = "";
            txtAltaNombre.Text = "";
            txtAltaApellido.Text = "";
            txtAltaCodPostal.Text = "";
            cmbAltaSexo.Text = "";
            cmbAltaEstadoCivil.Text = "";
            txtAltaHijos.Text = "";
            txtAltaDireccion.Text = "";
            txtAltaProvincia.Text = "";
        }

        private void txtAltaDNI_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        private void txtAltaHijos_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        private void txtAltaCodPostal_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        private void txtAltaProvincia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        private void insertarEmpleado(ref Empleado emp)
        {
            InsertarEmpleadoEnBD("Empleados", ref emp);
        }

        // Baja ////////////////////////////////////////////////

        private void btnBajaLimpiar_Click(object sender, EventArgs e)
        {
            txtBajaDNI.Text = "";
            txtBajaNombre.Text = "";
            txtBajaApellido.Text = "";
            dtBajaFechaNac.Value = DateTime.Now;
            txtBajaSexo.Text = "";
            txtBajaEstadoCivil.Text = "";
            txtBajaHijos.Text = "";
            txtBajaDireccion.Text = "";
            txtBajaCodPostal.Text = "";
            txtBajaProvincia.Text = "";
            txtEstado.Text = "";
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (txtBajaDNI.Text == "")
            {
                txtBajaDNI.Focus();
                MessageBox.Show("Ingrese el DNI");
                return;
            }
            Empleado eliminaEmpleado = new Empleado(); // (int.Parse(txtBajaDNI.Text.ToString()));
            if (!eliminaEmpleado.obtenerEmpleado(int.Parse(txtBajaDNI.Text.ToString())))
            {
                MessageBox.Show("Empleado no encontrado");
                return;
            }

            txtBajaDNI.Text = eliminaEmpleado.Dni.ToString();
            txtBajaNombre.Text = eliminaEmpleado.Nombre;
            txtBajaApellido.Text = eliminaEmpleado.Apellido;
            dtBajaFechaNac.Value = eliminaEmpleado.Fechanac;
            txtBajaSexo.Text = eliminaEmpleado.Genero;
            txtBajaEstadoCivil.Text = eliminaEmpleado.Estadocivil;
            txtBajaHijos.Text = eliminaEmpleado.Hijos.ToString();
            txtBajaDireccion.Text = eliminaEmpleado.Direccion;
            txtBajaCodPostal.Text = eliminaEmpleado.CodPostal.ToString();
            txtBajaProvincia.Text = eliminaEmpleado.Idprovincia.ToString();
            txtEstado.Text = eliminaEmpleado.Estado.ToString();

            if (eliminaEmpleado.Estado)
            {
                if (MessageBox.Show("Esta seguro que desea eliminar al empleado?", "Eliminar empleado", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    eliminaEmpleado.Estado = false;
                    txtEstado.Text = eliminaEmpleado.Estado.ToString();
                    ActualizarEmpleadoEnBD("Empleados", ref eliminaEmpleado); // Actualiza el estado (Actualiza a False)  
                }
                return;
            }
            else
            {
                MessageBox.Show("El Empleado ya se encontraba eliminado");
                return;
            }
        }

        private void txtBajaDNI_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        // Listado ////////////////////////////////////////

        public void btnListaFiltrar_Click(object sender, EventArgs e)
        {
            AccesoDatos conexion = new AccesoDatos();
            DataSet ds = new DataSet();
            string ClausulaSQL = "";
            if (txtModDNI.Text != "")
                ConstruirClausulaSQL("dni",
                                     "Igual:",
                                     txtModDNI.Text,
                                     ref ClausulaSQL);
            if (cmbModNombre.Text != "" && txtModNombre.Text != "")
                ConstruirClausulaSQL("nombre",
                                     cmbModNombre.Text,
                                     txtModNombre.Text,
                                     ref ClausulaSQL);
            if (cmbModApellido.Text != "" && txtModApellido.Text != "")
                ConstruirClausulaSQL("apellido",
                                     cmbModApellido.Text,
                                     txtModApellido.Text,
                                     ref ClausulaSQL);
            ds.Tables.Clear();
            agregarTablaDataSetSQLServer(
                "Select * from Empleados " + ClausulaSQL,
                    "Empleados",
                        ref ds);
            grdEmpleados.DataSource = ds.Tables["Empleados"];
        }

        private void ConstruirClausulaSQL(string NombreCampo,
                                  string Operador,
                                  string Valor,
                                  ref string Clausula)
        {
            string d1 = ""; //Delimitador 1
            string d2 = ""; //Delimitador 2
            if (Clausula == "")
                Clausula = Clausula + " WHERE ";
            else
                Clausula = Clausula + " AND ";
            switch (Operador)
            {
                case "Igual:":
                    d1 = " = ";
                    d2 = "";
                    break;
                case "Comienza con:":
                    d1 = " LIKE '";
                    d2 = "%'";
                    break;
                case "Termina en:":
                    d1 = " LIKE '%";
                    d2 = "'";
                    break;
                case "Contiene:":
                    d1 = " LIKE '%";
                    d2 = "%'";
                    break;
                case "Igual a:":
                    d1 = " ='";
                    d2 = "'";
                    break;
            } // SWITCH
            Clausula =
                Clausula + NombreCampo + d1 + Valor + d2;
        }
        
        private void txtModDNI_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
                e.Handled = true;
        }

        public void agregarTablaDataSetSQLServer(string ConsultaSQL,
                  string NombreTabla, ref DataSet ds)
        {
            SqlConnection cn = new SqlConnection(rutaSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(ConsultaSQL, cn);
            cn.Open();
            adaptador.Fill(ds, NombreTabla);
        }

        private void btnModLimpiar_Click(object sender, EventArgs e)
        {
            string ConsultaSQL = "Select * from Empleados order by dni";
            ds.Clear();
            agregarTablaDataSetSQLServer(ConsultaSQL,
                                         "Empleados",
                                         ref ds);
            grdEmpleados.DataSource = ds.Tables[0];
            txtModDNI.Text = "";
            cmbModNombre.Text = "";
            txtModNombre.Text = "";
            cmbModApellido.Text = "";
            txtModApellido.Text = "";
        }

        //private void btnModActualizar_Click(object sender, EventArgs e)
        //{
        //    ActualizarCambios(ref ds);
        //}

        private void ActualizarCambios(ref DataSet ds)
        {
            DataSet dsActualizar;
            DataSet dsEliminar;
            DataSet dsAgregar;
            if (ds.HasChanges(DataRowState.Modified))
            {
                dsActualizar = new DataSet();
                dsActualizar = ds.GetChanges(DataRowState.Modified);
                ActualizarEmpleadosEnBD("Empleados", dsActualizar);
            }
            if (ds.HasChanges(DataRowState.Added))
            {
                dsAgregar = new DataSet();
                dsAgregar = ds.GetChanges(DataRowState.Added);
                InsertarEmpleadosEnBD("Empleados", dsAgregar);
            }
            if (ds.HasChanges(DataRowState.Deleted))
            {
                dsEliminar = new DataSet();
                dsEliminar = ds.GetChanges(DataRowState.Deleted);
                EliminarEmpleadosEnBD("Empleados", dsEliminar);
            }
        }

        private void ArmarParametrosInsertarEmpleados(ref SqlCommand Comando, Empleado emp)
        {
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = Comando.Parameters.Add("@dni", SqlDbType.Int);
            SqlParametros.Value = emp.Dni;
            SqlParametros = Comando.Parameters.Add("@nombre", SqlDbType.NVarChar, 50);
            SqlParametros.Value = emp.Nombre;
            SqlParametros = Comando.Parameters.Add("@apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = emp.Apellido;
            SqlParametros = Comando.Parameters.Add("@fechanac", SqlDbType.DateTime);
            SqlParametros.Value = emp.Fechanac;
            SqlParametros = Comando.Parameters.Add("@fechadealta", SqlDbType.DateTime);
            SqlParametros.Value = emp.Fechadealta;
            SqlParametros = Comando.Parameters.Add("@sexo", SqlDbType.NVarChar, 50);
            SqlParametros.Value = emp.Genero;
            SqlParametros = Comando.Parameters.Add("@estadocivil", SqlDbType.NVarChar, 10);
            SqlParametros.Value = emp.Estadocivil;
            SqlParametros = Comando.Parameters.Add("@hijos", SqlDbType.Int);
            SqlParametros.Value = emp.Hijos;
            SqlParametros = Comando.Parameters.Add("@direccion", SqlDbType.NVarChar, 50);
            SqlParametros.Value = emp.Direccion;
            SqlParametros = Comando.Parameters.Add("@codpostal", SqlDbType.Int);
            SqlParametros.Value = emp.CodPostal;
            SqlParametros = Comando.Parameters.Add("@idprovincia", SqlDbType.Int);
            SqlParametros.Value = emp.Idprovincia;
            SqlParametros = Comando.Parameters.Add("@estado", SqlDbType.Bit);
            SqlParametros.Value = emp.Estado;
        }

        private void ArmarParametrosActualizarEmpleados(ref SqlCommand Comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = Comando.Parameters.Add("@dni", SqlDbType.Int);
            SqlParametros.Value = fila["dni"];
            SqlParametros = Comando.Parameters.Add("@nombre", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["nombre"];
            SqlParametros = Comando.Parameters.Add("@apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["apellido"];
            SqlParametros = Comando.Parameters.Add("@fechanac", SqlDbType.DateTime);
            SqlParametros.Value = fila["fechanac"];
            SqlParametros = Comando.Parameters.Add("@fechadealta", SqlDbType.DateTime);
            SqlParametros.Value = fila["fechadealta"];
            SqlParametros = Comando.Parameters.Add("@sexo", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["sexo"];
            SqlParametros = Comando.Parameters.Add("@estadocivil", SqlDbType.NVarChar, 10);
            SqlParametros.Value = fila["estadocivil"];
            SqlParametros = Comando.Parameters.Add("@hijos", SqlDbType.Int);
            SqlParametros.Value = fila["hijos"];
            SqlParametros = Comando.Parameters.Add("@direccion", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["direccion"];
            SqlParametros = Comando.Parameters.Add("@codpostal", SqlDbType.Int);
            SqlParametros.Value = fila["codpostal"];
            SqlParametros = Comando.Parameters.Add("@idprovincia", SqlDbType.Int);
            SqlParametros.Value = fila["idprovincia"];
            SqlParametros = Comando.Parameters.Add("@estado", SqlDbType.Bit);
            SqlParametros.Value = fila["estado"];
        }

        private void ArmarParametrosEmpleadosEliminar(ref SqlCommand Comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = Comando.Parameters.Add("@dni", SqlDbType.Int);
            SqlParametros.Value = fila["dni"];
        }

        private void ActualizarEmpleadoEnBD(String NombreTabla, ref Empleado emp)
        {
            SqlCommand Comando = new SqlCommand();
            ArmarParametrosInsertarEmpleados(ref Comando, emp);
            EjecutarSPEmpleados("spActualizarEmpleado", Comando);
        }

        private void ActualizarEmpleadosEnBD(String NombreTabla, DataSet ds)
        {
            int FilasActualizadas = 0;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                ArmarParametrosActualizarEmpleados(ref Comando, fila);
                FilasActualizadas += EjecutarSPEmpleados("spActualizarEmpleado", Comando);
            }
            MessageBox.Show("Se modificaron: " + FilasActualizadas + " empleados");
        }

        private int EjecutarSPEmpleados(String NombreSP, SqlCommand Comando)
        {
            int FilasCambiadas;
            SqlConnection Conexion = new SqlConnection(rutaSQL);
            Conexion.Open();
            SqlCommand cmd = new SqlCommand();
            cmd = Comando;
            cmd.Connection = Conexion;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = NombreSP;
            FilasCambiadas = cmd.ExecuteNonQuery();
            Conexion.Close();
            return FilasCambiadas;
        }

        private void InsertarEmpleadoEnBD(String NombreTabla, ref Empleado emp)
        {
            SqlCommand Comando = new SqlCommand();
            ArmarParametrosInsertarEmpleados(ref Comando, emp);
            EjecutarSPEmpleados("spInsertarEmpleado", Comando);
        }

        private void InsertarEmpleadosEnBD(String NombreTabla, DataSet ds)
        {
            int FilasInsertadas;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                ArmarParametrosActualizarEmpleados(ref Comando, fila);
                FilasInsertadas = EjecutarSPEmpleados("spInsertarEmpleado", Comando);
            }
        }

        private void EliminarEmpleadosEnBD(String NombreTabla, DataSet ds)
        {
            int FilasEliminadas;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                fila.RejectChanges();
                ArmarParametrosEmpleadosEliminar(ref Comando, fila);
                FilasEliminadas = EjecutarSPEmpleados("spEliminarEmpleado", Comando);
                MessageBox.Show("Se eliminaron: " + FilasEliminadas + " empleados");
            }
        }

        // Ingresos ////////////////////////////////////////

        private void btnIngresosObtener_Click(object sender, EventArgs e)
        {
            Ingreso registro = new Ingreso();

            if (validarCamposIngresos())
            {
                if (registro.existeIngreso(int.Parse(txtIngresosDNI.Text), dtpIngresosFecha.Value))
                {
                    registro.obtenerIngreso(int.Parse(txtIngresosDNI.Text), dtpIngresosFecha.Value);
                    if(cmbIngresosTipo.Text == "Entrada")
                    {
                        imgIngreso.ImageLocation = registro.Imageningreso;
                        txtIngresosHora.Text = registro.Fechaegreso.ToShortTimeString();
                    }
                    else if(cmbIngresosTipo.Text == "Salida" && registro.Imagenegreso != null)
                    {
                        imgIngreso.ImageLocation = registro.Imagenegreso;
                        txtIngresosHora.Text = registro.Fechaegreso.ToShortTimeString();
                    }
                    else
                    {
                        MessageBox.Show("El empleado registro un ingreso pero no un egreso");
                    }
                }
                else
                {
                    MessageBox.Show("No se registro un ingreso de ese empleado ese dia");
                }
            }
        }

        private bool validarCamposIngresos()
        {
            Empleado validar = new Empleado();

            if(txtIngresosDNI.Text == "")
            {
                txtIngresosDNI.Focus();
                MessageBox.Show("Ingrese el DNI");
                return false;
            }
            if(!validar.existe(int.Parse(txtIngresosDNI.Text)))
            {
                txtIngresosDNI.Focus();
                MessageBox.Show("Ingrese el DNI");
                return false;
            }
            if(cmbIngresosTipo.Text == "")
            {
                cmbIngresosTipo.Focus();
                MessageBox.Show("Ingrese el tipo de registro");
                return false;
            }
            return true;
        }

        private void btnIngresosLimpiar_Click(object sender, EventArgs e)
        {
            txtIngresosDNI.Text = "";
            txtIngresosHora.Text = "";
            cmbIngresosTipo.Text = "";
            imgIngreso.Image = ABM_De_Empleados.Properties.Resources.Image;
        }

        private void btnGraficos_Click(object sender, EventArgs e)
        {
            Form Graficos = new ABM_De_Empleados.Ventana();
            Graficos.ShowDialog();
        }
    }
}
